create database BD_ProjetoSI_OLTP;
go

CREATE TABLE FormaPagamento (
  cdFormaPagamento INTEGER  NOT NULL   IDENTITY ,
  Descricao VARCHAR(45)    ,
PRIMARY KEY(cdFormaPagamento));
GO

CREATE TABLE Funcionario (
  cdFuncionario INTEGER  NOT NULL  ,
  Nome VARCHAR(80)    NOT NULL,
  CPF VARCHAR(12)  NOT NULL,
  Sexo CHAR(1)  NOT NULL ,
  DataNascimento DATE    NOT NULL,
  EstadoCivil VARCHAR(30) NOT NULL,
  Telefone VARCHAR(13)  NOT NULL ,
  Email VARCHAR(100)  NOT NULL ,
  Rua VARCHAR(45)  NOT NULL,
  Numero VARCHAR(10)  NOT NULL,
  Bairro VARCHAR(45) NOT NULL ,
  CEP VARCHAR(10)  ,
  Cidade VARCHAR(45)   NOT NULL ,
  Estado VARCHAR(45)  NOT NULL,
  Cargo VARCHAR(50)   NOT NULL,
  Salario DECIMAL(11,2)   NOT NULL ,
PRIMARY KEY(cdFuncionario));
GO

CREATE TABLE CategoriaProduto (
  cdCategoriaProduto INTEGER  NOT NULL   IDENTITY ,
  DescricaoCategoria VARCHAR(45)   NOT NULL,
  Comissao DECIMAL(11,2)    NOT NULL ,
PRIMARY KEY(cdCategoriaProduto));
GO

CREATE TABLE Cliente (
  cdCliente INTEGER  NOT NULL  ,
  Nome VARCHAR(80)   NOT NULL,
  CPF VARCHAR(12)   NOT NULL,
  Sexo CHAR(1)   NOT NULL,
  DataNascimento DATE    NOT NULL,
  EstadoCivil VARCHAR(30)  NOT NULL,
  Telefone VARCHAR(13)   NOT NULL ,
  Email VARCHAR(100)  NOT NULL,
  Rua VARCHAR(45)    NOT NULL,
  Numero VARCHAR(10)  NOT NULL ,
  Bairro VARCHAR(45)    NOT NULL,
  CEP VARCHAR(10)  NOT NULL,
  Cidade VARCHAR(45) NOT NULL ,
  Estado VARCHAR(45)   NOT NULL ,
PRIMARY KEY(cdCliente));
GO

CREATE TABLE Produto (
  cdProduto INTEGER  NOT NULL   IDENTITY ,
  CategoriaProduto_cdCategoriaProduto INTEGER  NOT NULL  ,
  DescricaoProduto VARCHAR(45) NOT NULL ,
  Preco DECIMAL(11,2)  NOT NULL ,
  Estoque INT   NOT NULL ,
  DescricaoCategoria VARCHAR(45)    NOT NULL,
  Comissao DECIMAL(11,2)   NOT NULL ,
  Unidade VARCHAR(3)  NOT NULL,
  EstoqueMinimo INT NOT NULL,
  CodigoFabricante VARCHAR(20)  NOT NULL ,
PRIMARY KEY(cdProduto)  ,
  FOREIGN KEY(CategoriaProduto_cdCategoriaProduto)
    REFERENCES CategoriaProduto(cdCategoriaProduto));
GO

CREATE INDEX IFK_proCatPro ON Produto (CategoriaProduto_cdCategoriaProduto);
GO

CREATE TABLE Venda (
  cdVenda INTEGER  NOT NULL   IDENTITY ,
  Funcionario_cdFuncionario INTEGER  NOT NULL  ,
  Cliente_cdCliente INTEGER  NOT NULL  ,
  FormaPagamento_cdFormaPagamento INTEGER  NOT NULL  ,
  DataVenda DATE  NOT NULL  ,
  ValorTotal DECIMAL(11,2)  NOT NULL  ,
  Situacao VARCHAR(20)  NOT NULL  ,
  TotalComissao DECIMAL(11,2)  NOT NULL    ,
PRIMARY KEY(cdVenda)      ,
  FOREIGN KEY(Funcionario_cdFuncionario)
    REFERENCES Funcionario(cdFuncionario),
  FOREIGN KEY(Cliente_cdCliente)
    REFERENCES Cliente(cdCliente),
  FOREIGN KEY(FormaPagamento_cdFormaPagamento)
    REFERENCES FormaPagamento(cdFormaPagamento));
GO

CREATE INDEX IFK_funPed ON Venda (Funcionario_cdFuncionario);
GO
CREATE INDEX IFK_venCli ON Venda (Cliente_cdCliente);
GO
CREATE INDEX IFK_venCatVenda ON Venda (FormaPagamento_cdFormaPagamento);
GO


CREATE TABLE ItemVenda (
  Produto_cdProduto INTEGER  NOT NULL  ,
  Venda_cdVenda INTEGER  NOT NULL  ,
  Quantidade INTEGER  NOT NULL  ,
  Valor DECIMAL(11,2)  NOT NULL  ,
  ValorComissao DECIMAL(11,2)  NOT NULL    ,
PRIMARY KEY(Produto_cdProduto, Venda_cdVenda)    ,
  FOREIGN KEY(Produto_cdProduto)
    REFERENCES Produto(cdProduto),
  FOREIGN KEY(Venda_cdVenda)
    REFERENCES Venda(cdVenda));
GO

CREATE INDEX IFK_proIteVen ON ItemVenda (Produto_cdProduto);
GO
CREATE INDEX IFK_venItemPed ON ItemVenda (Venda_cdVenda);
GO



